/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package MainPackage;

import java.util.*;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author n.kaminski
 */
@XmlRootElement
public class UserGewicht {
    
    /**
     * Liste aller Gewichte eines Users
     */
    private List<Float> gewichte = new ArrayList<Float>();
    
    /**
     * Zu den Gewichten die passenden Daten
     */
    private List<Date> daten = new ArrayList<Date>();
    
    /**
     * Konstruktor ohne Parameter
     */
    public UserGewicht (){
    
    }
    
    /**
     * Fügt ein Gewicht hinzu.
     * Wenn schon ein Gewicht für den mit datum angegebenen Tag vorhanden ist, wird nichts eingetragen.
     * @param gew Das Gewicht, welches eingetragen werden soll
     * @param datum Das dazu gehörige Datum
     */
    public void insert(float gew, Date datum){
        if(!daten.contains(datum)){
            gewichte.add(gew);
            daten.add(datum);
            this.WerteSortieren_NachDatum();
        }else{
            JOptionPane.showMessageDialog(null,
                    "Es wurde schon ein Gewicht für den "+datum+" eingetragen.", 
                    "Fehler", 
                    JOptionPane.ERROR_MESSAGE);
        }
    }
    
    /**
     * Gibt die Anzahl von vorhandenen Gewichten zurück
     * @return die Anzahl
     */
    public int Count(){
        return gewichte.size();
    }
    
    /**
     * Füllt eine JTable mit den Gewichts und Datumswerten und zeigt zusätzlich immer noch die Tendenz an
     * @param table Die Tabelle, welche gefüllt werden soll
     */
    public void FillJTable(JTable table){
        String[] ColNames = {"Datum", "Gewicht", "Tendenz"};
        DefaultTableModel dtm = new DefaultTableModel(ColNames, 0);
        
        if(this.Count() > 0){
            Date d = this.getDate(0);
            String s = d.getDate()+"."+(d.getMonth()+1)+"."+(d.getYear()+1900);
            Object[] o = new Object[]{s,this.gewichte.get(0),0};
            dtm.addRow(o);
            
            for(int i = 1; i < this.Count(); ++i){
                d = this.getDate(i);
                
                s = d.getDate()+"."+(d.getMonth()+1)+"."+(d.getYear()+1900);
                o = new Object[]{s,this.gewichte.get(i), (this.getGewicht(i)-this.getGewicht(i-1)) };
                dtm.addRow(o);
            }
            //dtm.setValueAt("Kilo Joule (kj)", 0, 0);
            //dtm.setValueAt(this.getKcalAsKJoule(), 0, 1);
        }
        table.setModel(dtm);
    }
    
    /**
     * Liefert einen Datumswert zurück
     * @param index Welchen Datumswert zurückgegeben werden soll
     * @return Der Datumswert an der Stelle index
     */
    public Date getDate(int index){
        return daten.get(index);
    }
    
    /**
     * Liefert ein Gewicht zurück
     * @param index Welches Gewicht zurück geben werden soll
     * @return Das Gewicht an der Stelle index
     */
    public float getGewicht(int index){
        return gewichte.get(index);
    }
    
    /**
     * Gibt das letzte eingetragene Gewicht zurück
     * @return letztes Gewicht 
     */
    public float getGewicht(){
        if(this.Count() > 0)
            return getGewicht(gewichte.size()-1);
        return 0;
    }
    
    /**
     * Sortiert alle Daten (Gewichte und Datumswerte) anhand ihres eintragenen Datums aufsteigend
     */
    private void WerteSortieren_NachDatum(){
        //Bubblesort ^^
        float zwF;
        Date zwD;
        int n = this.Count();
        boolean swapped;
        do{
            swapped = false;
            for(int i = 0; i < n-1; ++i){
                if(daten.get(i).compareTo(daten.get(i+1)) > 0){
                    zwD = daten.get(i);
                    daten.set(i, daten.get(i+1));
                    daten.set(i+1, zwD);
                    
                    zwF = gewichte.get(i);
                    gewichte.set(i, gewichte.get(i+1));
                    gewichte.set(i+1, zwF);
                    swapped = true;
                }
            }
        }while(swapped);
    }
    
    //<editor-fold defaultstate="collapsed" desc="Getter & Setter für Attribute">
    @XmlElement( name = "gewicht" )
    public List<Float> getGewichte(){
        return gewichte;
    }
    public void setGewichte(List<Float> gewichte){
        this.gewichte = gewichte;
    }
    @XmlElement( name = "datum" )
    public List<Date> getDaten(){
        return this.daten;
    }
    public void setDaten(List<Date> daten){
        this.daten = daten;
    }
    //</editor-fold>
}
